function log(a){console.log&&console.log(a)}var AbstractEdge=function(){};AbstractEdge.prototype={hide:function(){this.connection.fg.hide(),this.connection.bg&&this.bg.connection.hide()}};var EdgeFactory=function(){this.template=new AbstractEdge,this.template.style=new Object,this.template.style.directed=!1,this.template.weight=1};EdgeFactory.prototype={build:function(a,b){var c=jQuery.extend(!0,{},this.template);return c.source=a,c.target=b,c}};var Graph=function(){this.nodes={},this.edges=[],this.snapshots=[],this.edgeFactory=new EdgeFactory};Graph.prototype={addNode:function(a,b){return void 0==this.nodes[a]&&(this.nodes[a]=new Graph.Node(a,b)),this.nodes[a]},addEdge:function(a,b,c){var d=this.addNode(a),e=this.addNode(b),f=this.edgeFactory.build(d,e);jQuery.extend(f.style,c),d.edges.push(f),this.edges.push(f),e.edges.push(f)},snapShot:function(a){},removeNode:function(a){delete this.nodes[a];for(var b=0;b<this.edges.length;b++)this.edges[b].source.id!=a&&this.edges[b].target.id!=a||(this.edges.splice(b,1),b--)}},Graph.Node=function(a,b){return b=b||{},b.id=a,b.edges=[],b.hide=function(){this.hidden=!0,this.shape&&this.shape.hide();for(i in this.edges)(this.edges[i].source.id==a||this.edges[i].target==a)&&this.edges[i].hide&&this.edges[i].hide()},b.show=function(){this.hidden=!1,this.shape&&this.shape.show();for(i in this.edges)(this.edges[i].source.id==a||this.edges[i].target==a)&&this.edges[i].show&&this.edges[i].show()},b},Graph.Node.prototype={},Graph.Renderer={},Graph.Renderer.Raphael=function(a,b,c,d){this.width=c||400,this.height=d||400;var e=this;this.r=Raphael(a,this.width,this.height),this.radius=40,this.graph=b,this.mouse_in=!1,this.graph.render||(this.graph.render=function(){}),this.isDrag=!1,this.dragger=function(a){this.dx=a.clientX,this.dy=a.clientY,e.isDrag=this,this.set&&this.set.animate({"fill-opacity":.1},200)&&this.set.toFront(),a.preventDefault&&a.preventDefault()};var f=document.getElementById(a);f.onmousemove=function(a){if(a=a||window.event,e.isDrag){var b=e.isDrag.set.getBBox(),c=a.clientX-e.isDrag.dx+(b.x+b.width/2),d=a.clientY-e.isDrag.dy+(b.y+b.height/2),f=a.clientX-(c<20?c-20:c>e.width-20?c-e.width+20:0),g=a.clientY-(d<20?d-20:d>e.height-20?d-e.height+20:0);e.isDrag.set.translate(f-Math.round(e.isDrag.dx),g-Math.round(e.isDrag.dy));for(var h in e.graph.edges)e.graph.edges[h].connection&&e.graph.edges[h].connection.draw();e.isDrag.dx=f,e.isDrag.dy=g}},f.onmouseup=function(){e.isDrag&&e.isDrag.set.animate({"fill-opacity":.6},500),e.isDrag=!1},this.draw()},Graph.Renderer.Raphael.prototype={translate:function(a){return[(a[0]-this.graph.layoutMinX)*this.factorX+this.radius,(a[1]-this.graph.layoutMinY)*this.factorY+this.radius]},rotate:function(a,b,c){var d=b*Math.cos(c),e=b*Math.sin(c);return[a[0]+d,a[1]+e]},draw:function(){this.factorX=(this.width-2*this.radius)/(this.graph.layoutMaxX-this.graph.layoutMinX),this.factorY=(this.height-2*this.radius)/(this.graph.layoutMaxY-this.graph.layoutMinY);for(a in this.graph.nodes)this.drawNode(this.graph.nodes[a]);for(var a=0;a<this.graph.edges.length;a++)this.drawEdge(this.graph.edges[a])},drawNode:function(a){var b=this.translate([a.layoutPosX,a.layoutPosY]);if(a.point=b,a.shape){var c=a.shape.getBBox(),d={x:c.x+c.width/2,y:c.y+c.height/2};return a.shape.translate(Math.round(b[0]-d.x),Math.round(b[1]-d.y)),this.r.safari(),a}var e;a.render||(a.render=function(a,b){var c=Raphael.getColor(),d=a.ellipse(0,0,30,20).attr({fill:c,stroke:c,"stroke-width":2});return d.node.id=b.label||b.id,e=a.set().push(d).push(a.text(0,30,b.label||b.id))}),a.shapes,e=a.render(this.r,a).hide(),e.attr({"fill-opacity":.6}),e.items.forEach(function(a){a.set=e,a.node.style.cursor="move"}),e.mousedown(this.dragger);var f=e.getBBox();e.translate(Math.round(b[0]-(f.x+f.width/2)),Math.round(b[1]-(f.y+f.height/2))),a.hidden||e.show(),a.shape=e},drawEdge:function(a){if(!a.backedge){if(a.source.hidden||a.target.hidden)return void(a.connection&&a.connection.fg.hide()|a.connection.bg&&a.connection.bg.hide());if(!a.connection)return a.style&&a.style.callback&&a.style.callback(a),void(a.connection=this.r.connection(a.source.shape,a.target.shape,a.style));a.connection.fg.show(),a.connection.bg&&a.connection.bg.show(),a.connection.draw()}}},Graph.Layout={},Graph.Layout.Spring=function(a){this.graph=a,this.iterations=500,this.maxRepulsiveForceDistance=6,this.k=2,this.c=.01,this.maxVertexMovement=.5,this.layout()},Graph.Layout.Spring.prototype={layout:function(){this.layoutPrepare();for(var a=0;a<this.iterations;a++)this.layoutIteration();this.layoutCalcBounds()},layoutPrepare:function(){for(i in this.graph.nodes){var a=this.graph.nodes[i];a.layoutPosX=0,a.layoutPosY=0,a.layoutForceX=0,a.layoutForceY=0}},layoutCalcBounds:function(){var a=1/0,b=-(1/0),c=1/0,d=-(1/0);for(i in this.graph.nodes){var e=this.graph.nodes[i].layoutPosX,f=this.graph.nodes[i].layoutPosY;e>b&&(b=e),e<a&&(a=e),f>d&&(d=f),f<c&&(c=f)}this.graph.layoutMinX=a,this.graph.layoutMaxX=b,this.graph.layoutMinY=c,this.graph.layoutMaxY=d},layoutIteration:function(){var a=new Array;for(var b in this.graph.nodes){var c=this.graph.nodes[b];for(var d in a){var e=this.graph.nodes[a[d]];this.layoutRepulsive(c,e)}a.push(b)}for(var f=0;f<this.graph.edges.length;f++){var g=this.graph.edges[f];this.layoutAttractive(g)}for(f in this.graph.nodes){var h=this.graph.nodes[f],i=this.c*h.layoutForceX,j=this.c*h.layoutForceY,k=this.maxVertexMovement;i>k&&(i=k),i<-k&&(i=-k),j>k&&(j=k),j<-k&&(j=-k),h.layoutPosX+=i,h.layoutPosY+=j,h.layoutForceX=0,h.layoutForceY=0}},layoutRepulsive:function(a,b){if("undefined"!=typeof a&&"undefined"!=typeof b){var c=b.layoutPosX-a.layoutPosX,d=b.layoutPosY-a.layoutPosY,e=c*c+d*d;if(e<.01){c=.1*Math.random()+.1,d=.1*Math.random()+.1;var e=c*c+d*d}var f=Math.sqrt(e);if(f<this.maxRepulsiveForceDistance){var g=this.k*this.k/f;b.layoutForceX+=g*c/f,b.layoutForceY+=g*d/f,a.layoutForceX-=g*c/f,a.layoutForceY-=g*d/f}}},layoutAttractive:function(a){var b=a.source,c=a.target,d=c.layoutPosX-b.layoutPosX,e=c.layoutPosY-b.layoutPosY,f=d*d+e*e;if(f<.01){d=.1*Math.random()+.1,e=.1*Math.random()+.1;var f=d*d+e*e}var g=Math.sqrt(f);g>this.maxRepulsiveForceDistance&&(g=this.maxRepulsiveForceDistance,f=g*g);var h=(f-this.k*this.k)/this.k;void 0==a.attraction&&(a.attraction=1),h*=.5*Math.log(a.attraction)+1,c.layoutForceX-=h*d/g,c.layoutForceY-=h*e/g,b.layoutForceX+=h*d/g,b.layoutForceY+=h*e/g}},Graph.Layout.Ordered=function(a,b){this.graph=a,this.order=b,this.layout()},Graph.Layout.Ordered.prototype={layout:function(){this.layoutPrepare(),this.layoutCalcBounds()},layoutPrepare:function(a){for(i in this.graph.nodes){var b=this.graph.nodes[i];b.layoutPosX=0,b.layoutPosY=0}var c=0;for(i in this.order){var b=this.order[i];b.layoutPosX=c,b.layoutPosY=Math.random(),c++}},layoutCalcBounds:function(){var a=1/0,b=-(1/0),c=1/0,d=-(1/0);for(i in this.graph.nodes){var e=this.graph.nodes[i].layoutPosX,f=this.graph.nodes[i].layoutPosY;e>b&&(b=e),e<a&&(a=e),f>d&&(d=f),f<c&&(c=f)}this.graph.layoutMinX=a,this.graph.layoutMaxX=b,this.graph.layoutMinY=c,this.graph.layoutMaxY=d}},Raphael.el.tooltip=function(a){return this.tp=a,this.tp.o={x:0,y:0},this.tp.hide(),this.hover(function(a){this.mousemove(function(a){this.tp.translate(a.clientX-this.tp.o.x,a.clientY-this.tp.o.y),this.tp.o={x:a.clientX,y:a.clientY}}),this.tp.show().toFront()},function(a){this.tp.hide(),this.unmousemove()}),this},Array.prototype.forEach||(Array.prototype.forEach=function(a){var b=this.length;if("function"!=typeof a)throw new TypeError;for(var c=arguments[1],d=0;d<b;d++)d in this&&a.call(c,this[d],d,this)});
